<!DOCTYPE html>
<html>

	<head>
		<meta charset="UTF-8">
		<title></title>
		<script type="text/javascript">

			function fun(a,b) {
				console.log("a = "+a);
				console.log("b = "+b);
				console.log(this);
			}
			
			var obj = {
				name: "obj",
				sayName:function(){
					console.log(this.name);
				}
			};

			/*
			 * call()和apply()
			 * 	- 这两个方法都是函数对象的方法，需要通过函数对象来调用
			 * 	- 当对函数调用call()和apply()都会调用函数执行
			 *
			 * 不同点：
			 * 	- 在调用call()和apply()可以将一个对象指定为第一个参数
			 * 		此时这个对象将会成为函数执行时的this
			 * 	- call()方法可以将实参在对象之后依次传递
			 * 	- apply()方法需要将实参封装到一个数组中统一传递
			 * 
			 * 重点回顾，this的情况：
			 * 		1.以函数形式调用时，this永远都是window
			 * 		2.以方法的形式调用时，this是调用方法的对象
			 * 		3.以构造函数的形式调用时，this是新创建的那个对象
			 * 		4.使用call和apply调用时，this是指定的那个对象
			 */

			console.log("-----------使用call传参和apply传参调用fun函数---------------");

			//使用call传参和apply传参调用fun函数
			fun.call(obj,2,3);
			fun.apply(obj,[2,3]);

			console.log("-----------初始化调用---------------");

			//初始化调用
			fun.apply();
			fun.call();
			fun(); //this等于window

			var obj2 = {
				name: "obj2Name"
			};

			console.log("-----------函数传参数obj2调用---------------");

			//函数传参数调用
			fun.call(obj2);
			fun.apply(obj2);
			fun(); //this等于window

			console.log("-----------使用函数原生方法apply传入obj2进行调用sayName方法sayName方法---------------");

			//先得到obj对象下sayName方法，
			//使用函数原生方法apply传入obj2进行调用sayName方法sayName方法
			obj.sayName.apply(obj2); //this等于obj2
		</script>
	</head>

	<body>
	</body>

</html>